%include "boot.inc"
section  .text
bits     16
extern   head_start
global   setup_start

setup_start:
	mov bp, _msg_in_setup
	mov ax, 0x1301
	mov bx, 0x000c
	mov cx, _msg_in_setup_len
	mov dx, 0x0200
	int 0x10

_enter_protected_mode:
	;   打开 A20 地址线
	in  al, 0x92
	or  al, 0x02
	out 0x92, al

	lgdt [gdt_base]

	;   设置 cr0 pe 位
	mov eax, cr0
	or  eax, 0x1
	mov cr0, eax

	jmp CODE_SELECTOR:head_start

_msg_in_setup:
	db "In setup!", 0

_msg_in_setup_end:
	_msg_in_setup_len equ _msg_in_setup_end - _msg_in_setup

gdt_zero:
	dq 0

gdt_code:
	dq CODE_SEC_DESC

gdt_data:
	dq DATA_SEC_DESC

gdt_video:
	dq VIDEO_SEC_DESC

	GDT_SIZE equ $ - gdt_zero
	GDT_LIMIT equ GDT_SIZE - 1

gdt_base:
	dw GDT_LIMIT
	dd gdt_zero
